<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 闭包
    // 闭包，在一个函数作用域调用另一个函数，并能访问到当前函数的所有作用域成员
    // 本质：当前函数中存在指向父级的调用
    // 条件：1.函数 2.父子引用关系 3.嵌套函数
    // 用途： 1.函数外部读取函数内部成员
          // 2.让函数成员始终活在内存中
    var a = 20;
    function outer() {
      var a = 10;
      // 闭包环境中的变量不是一成不变的
      function inner() {
        console.log(a);
      }
      return inner;
    };

    var inn = outer();
    inn()
// 练习1
    function fun() {
      var a=1;
      function bar() {
        console.log(this);
        console.log(a);
      };
      baz(bar);
    };
    function baz(fn) {
      fn();
    }
    fun()
    // 练习2
    var arr =  [];
    for (var i = 0; i < 5; i++) {
      arr[i] = function () {
        console.log(i);
      }
    };
    arr[0]();
    arr[2]();
    arr[4]();
// 修正
    for (var i = 0; i < 5; i++) {
      (function (i) {
        arr[i] = function () {
        console.log(i);
        }
      })(i)
    };
    arr[0]();
    arr[2]();
    arr[4]();

  // 练习3
  var a = 10
function fun3() {
  var a = 20;
  return function () {
    return function () {
      console.log(a);
    }
  }
}
var f1 = fun3();
var f2 =  f1();
f2();


function fun4() {
  var a = 30;
  function fun5() {
    function fun6() {
      console.log(a);
    }
    fun6();
  }
  fun5();
}
var f11 = fun4;
f11()
  </script>
</body>
</html>